package com.yociyy.common.utils;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.system.SystemUtil;
import com.yociyy.common.constants.Constants;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * entity 基础字段工具类 用于注入公共字段值
 *
 * @author: YoCiyy
 * @date: 2020/5/18
 */
public class EntityHelper {

	/**
	 * 新增操作 - 组装基础公共字段
	 *
	 * @param entity 待填充公共字段entity对象
	 * @param <T> 泛型
	 */
	public static <T> void assembleCrtFields(T entity) {
		Map<String, Object> fieldsMap = new HashMap<>(4);
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

		if (ObjectUtil.isNotNull(request)) {
			fieldsMap.put("crtName", URLUtil.decode(StrUtil.trimToEmpty(request.getHeader(Constants.CURRENT_USERNAME))));
			fieldsMap.put("crtUser", StrUtil.trimToEmpty(request.getHeader(Constants.CURRENT_ID)));
			fieldsMap.put("crtHost", SystemUtil.getHostInfo().getAddress());
			fieldsMap.put("crtTime", new Date());
		}

		// 填充默认属性值
		invokeSetDefaultValues(entity, fieldsMap);
	}

	/**
	 * 修改操作 - 组装基础公共字段
	 *
	 * @param entity 待填充公共字段entity对象
	 * @param <T> 泛型
	 */
	public static <T> void assembleUpdFields(T entity) {
		Map<String, Object> fieldsMap = new HashMap<>(4);
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

		if (ObjectUtil.isNotNull(request)) {
			fieldsMap.put("updName", URLUtil.decode(StrUtil.trimToEmpty(request.getHeader(Constants.CURRENT_USERNAME))));
			fieldsMap.put("updUser", StrUtil.trimToEmpty(request.getHeader(Constants.CURRENT_ID)));
			fieldsMap.put("updHost", SystemUtil.getHostInfo().getAddress());
			fieldsMap.put("updTime", new Date());
		}

		// 填充默认属性值
		invokeSetDefaultValues(entity, fieldsMap);
	}

	/**
	 * 通过字段属性Map对对象的属性进行赋值
	 *
	 * @param entity 对象
	 * @param fieldsMap 字段属性Map<字段名,字段值>
	 */
	private static <T> void invokeSetDefaultValues(T entity, Map<String, Object> fieldsMap) {
		for (Map.Entry<String, Object> field : fieldsMap.entrySet()) {
			ReflectUtil.setFieldValue(entity, field.getKey(), field.getValue());
		}
	}

}
